<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        /*
        手写call方法
        1.定义函数
        2.this并调用原函数
        3.接受剩余参数并返回结果
        4.调用Symbol调优
        */
        //1.定义函数
        Function.prototype.myCall = function (context, ...args) {
            //2.设置this并调用原函数
            //context是传入的需要设置为this的对象
            //this是原函数（this.myCall）
            //给content加一个一定和原属性不重名的新属性（方法）
            //5使用Symbol
            let key = Symbol('fn')
            context[key] = this
            //这个this是fn
            // context.f()
            //3.接受剩余参数并返回结果
            const res = context[key](...args)
            delete context[key]//删除
            //4.返回结果
            return res
        }



        function fn(name, age) {
            console.log(this)
            console.log(name, age)
            return name + age
        }
        const person = {
            name: 'why'
        }

        const res = fn.myCall(person, 20, 18)
        console.log('--返回值为--' + res)

        ///----------------------------
        console.log('------------------')
        const me = {
            name: "1111"
        }
        function fn2(name, age) {
            console.log(this)
            console.log(name, age)
            return name + age
        }
        fn2.myCall(me, 20, 18)


        console.log('------=======================')

        //测试symbol
        //调用Symbol内置函数，可以穿字符串作为标记
        //返回一个唯一的值
        const s1 = Symbol('why')
        const s2 = Symbol('why')
        console.log(s1 === s2)
    </script>
</body>